<?php

require_once('../krn_table.php');
require_once('../fct_dao_statut.php');
require_once('../commons_constantes.php');
require_once('../commons_atom.php');

tableDefinition
	(TABLE_DEFINITION
	,'tblCompte'
	,WEDDING_DBNAME
	,'COMPTE'
	,array
		('ID'
		,'LOGIN'
		,'PASSWORD'
		,'NOM_SITE_URL'
		,'CIVILITE'
		,'NOM'
		,'PRENOM'
		,'EMAIL'
		,'TELEPHONE_FR'
		,'ID_STATUT'
		,'DATE_CREATION'
		,'DATE_MAJ'
		)
	);
	
	
/***********************************************************************************************************
 * Définition des fonctions d'interactions
 ***********************************************************************************************************/

/**
 * Méthode de création de compte administrateur pour un mariage donné
 * @param string $login Login de connexion du compte à créer
 * @param string $password Mot de passe du compte à créer
 * @param string $nomUrlSite Nom à utiliser dans l'url de connexion au site du mariage
 * @param string $civilite Civilité du créateur du compte
 * @param string $nom Nom du créateur du compte
 * @param string $prenom Prénom du créateur du compte
 * @param string $email Email du créateur du compte
 * @param string $telephoneFr Téléphone (au format français) du créateur du compte
 * @return int l'identifiant technique du compte créé
 */
function creerCompte
	($login
	,$password
	,$nomUrlSite
	,$civilite
	,$nom
	,$prenom
	,$email
	,$telephoneFr
	)
{
	//On vérifie d'abord si le compte existe déjà
	$alreadyExists = existCompteByLogin($login);
	if ($alreadyExists) {
		throw new Exception("Le compte de login $login existe déjà", ERR_UNAUTHORIZED);
	}
	
	$currDate = gmdate('c');
	$idStatutByCode = getAllIdStatutByCode();
	$idInserted = insert
					('tblCompte'
					,array
						('LOGIN'			=> '?'
						,'PASSWORD'			=> '?'
						,'NOM_SITE_URL'		=> '?'
						,'CIVILITE'			=> '?'
						,'NOM'				=> '?'
						,'PRENOM'			=> '?'
						,'EMAIL'			=> '?'
						,'TELEPHONE_FR'		=> '?'
						,'ID_STATUT'		=> '?'
						,'DATE_CREATION'	=> '?'
						,'DATE_MAJ'			=> '?'
						)
					,array
						($login
						,$password
						,$nomUrlSite
						,$civilite
						,$nom
						,$prenom
						,$email
						,$telephoneFr
						,$idStatutByCode[STATUT_A_VALIDER]
						,$currDate
						,$currDate
						)
					);
	return $idInserted;
}

/**
 * Valide le compte d'identifiant $idCompte en changeant son statut à validé
 * @param $idCompte
 * @param $dateMaj
 * @return true / false
 */
function validerCompte
	($idCompte
	,$dateMaj=null
	)
{
	$idStatutByCode = getAllIdStatutByCode();
	
	return changeStatutCompte
			($idStatutByCode[STATUT_VALIDE]
			,$idCompte
			,$dateMaj
			);
}

/**
 * Supprime le compte d'identifiant $idCompte en changeant son statut à supprimé
 * @param $idCompte
 * @param $dateMaj
 * @return true / false
 */
function supprimerCompte
	($idCompte
	,$dateMaj=null
	)
{
	$idStatutByCode = getAllIdStatutByCode();
	
	return changeStatutCompte
			($idStatutByCode[STATUT_SUPPRIME]
			,$idCompte
			,$dateMaj
			);
}

/**
 * Met à jour l'identifiant de statut du compte d'identifiant $idCompte avec l'identifiant $idStatut
 * @param $idStatut
 * @param $idCompte
 * @param $dateMaj
 */
function changeStatutCompte
	($idStatut
	,$idCompte
	,$dateMaj=null
	)
{
	if ($dateMaj == null) {
		$dateMaj = gmdate('c');
	}
	
	//Vérification de l'existence du statut
	$statut = getStatutById($idStatut);
	if (count($statut) == 0) {
		//Aucun statut d'identifiant $idStatut n'existe
		throw new Exception("Aucun statut d'identifiant $idStatut n'a été trouvé", ERR_BAD_REQUEST);
	}
					
	$updated = update
			('tblCompte'
			,array
				('ID_STATUT'	=> '?'
				,'DATE_MAJ'		=> '?'
				)
			,'WHERE ID = ?'
			,array
				($idStatut
				,$dateMaj
				,$idCompte
				)
			);
	return $updated;
}

/**
 * Retourne le compte d'identifiant $idCompte.<br />
 * Retourne un tableau vide si le compte n'existe pas<br />
 * Lève une exception si plusieurs résultats sont trouvés : Ne peut pas se produire
 * @param $idCompte
 * @return array : compte cherché ou tableau vide si non trouvé
 */
function getCompte($idCompte) {
	$compte = select('tblCompte', '*', 'WHERE ID = ?', array($idCompte));
	if (count($compte) == 1) {
		return $compte[0];
	} else if (count($compte) > 1) {
		throw new Exception('Plusieurs comptes d\'identifiant '.$idCompte.' ont été retournés', ERR_NOT_ACCEPTABLE);
	}
	return $compte;
}

/**
 * Retourne le nom de l'url pour le compte correspondant
 * @param int $idCompte
 * @return string
 */
function getNomSiteUrlFromCompte($idCompte) {
	$compte = getCompte($idCompte);
	return $compte['NOM_SITE_URL'];
}

/**
 * Retourne true si le compte de login $login existe<br />
 * Retourne false autrement<br />
 * @param $login
 * @return true / false
 */
function existCompteByLogin($login) {
	$where = 'WHERE LOGIN = ?';
	$bindings = array($login);
	
	$compte = select('tblCompte', '*', $where, $bindings);
	return (count($compte) >= 1);
}

/**
 * Retourne le compte de login $login et de mot de passe $password<br />
 * Retourne un tableau vide si le compte n'existe pas<br />
 * Lève une exception si plusieurs résultats sont trouvés : Ne peut pas se produire
 * @param $login
 * @param $password
 * @return array : compte cherché ou tableau vide si non trouvé
 */
function getComtpeByLoginPassword($login, $password) {
	$where = 'WHERE LOGIN = ? AND PASSWORD = ?';
	$bindings = array($login, $password);
	
	$compte = select('tblCompte', '*', $where, $bindings);
	if (count($compte) == 1) {
		return $compte[0];
	} else if (count($compte) > 1) {
		throw new Exception('Plusieurs comptes d\'identifiant '.$idCompte.' ont été retournés', ERR_NOT_ACCEPTABLE);
	}
	return $compte;
}
	